package com.org.manhu.chargehelper.updateutils;

import java.io.IOException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;

/**
 * @文件名：UpdateUtil.java
 * @包名：com.org.manhu.updateutils
 * @作者：李朋辉 @QQ：892839211
 * @创建时间：2015年1月6日 下午3:01:50
 *
 * @描述：检查应用是否有新版本的工具类
 */
public class UpdateUtil {

	private IUpdateUtilsImpl update_utils;
	/** 更新提示对话框 **/
	private AlertDialog update_dialog;
	/** 是否更新 **/
	private boolean isUpdate;

	/** 上下文环境 **/
	private static Context mContext;

	/** 检查应用是否有新版本的工具类的单例对象 **/
	private static UpdateUtil instance;

	/** 更新信息的文本所在的路径 **/
	private String version_url = "http://img1.manhu.com/update/charge_update_version.txt";

	/** apk的更新地址 **/
	private String update_url= "http://img1.manhu.com/ChargeHelper/ChargeHelper.apk ";

	private UpdateUtil() {

	}

	/**
	 * @描述：获取检查应用是否有新版本的工具类的对象
	 * @return
	 */
	public static UpdateUtil getInstance() {
		if (instance == null) {
			instance = new UpdateUtil();
		}
		return instance;
	}

	/**
	 * @描述：调用此方法检查应用是否更新，并执行更新操作
	 * @param context
	 */
	public void Update(Context context) {
		init(context);
		mContext = context;
		isUseStrictMode(context);
		checkUpdate();// 检测更新
	}

	/**
	 * @描述：设置更新过程中网络异常是是否显示notification， 
	 *                                   默认不可用，如果设置可用则必须调用initNotification（）方法对notification进行初始化
	 * @param available
	 */
	public void notificationAvailable(boolean available) {
		update_utils.notificationAvailable(available);
	}

	/**
	 * @描述：初始化notification
	 * @param content
	 *            notification 的内容
	 * @param iconId
	 *            notification 的图标
	 */
	public void initNotification(String content, int iconId) {
		update_utils.initNOtification("", content, iconId);
	}

	/**
	 * @描述：初始化notification
	 * @param iconId
	 *            notification 的图标
	 */
	public void initNotification(int iconId) {
		update_utils.initNOtification("", "", iconId);
	}

	/**
	 * @描述：初始化notification
	 * @param title
	 *            notification 的标题
	 * @param content
	 *            notification 的内容
	 * @param iconId
	 *            notification 的图标
	 */
	public void initNotification(String title, String content, int iconId) {
		update_utils.initNOtification(title, content, iconId);
	}

	/**
	 * @描述：初始化操作，清空更新配置文件
	 * @param context
	 */
	private void init(Context context) {
		SharedPreferences update_settings = context.getSharedPreferences(
				"update", Activity.MODE_PRIVATE);
		update_settings.edit().clear().commit();// 清空更新配置文件
	}

	/**
	 * @描述：判断sdk版本号的高低
	 * @return
	 */
	private boolean isLowOrHigh() {
		return android.os.Build.VERSION.SDK_INT > 11 ? true : false;
	}

	/**
	 * @描述：检查更新,提示更新内容
	 */
	private void checkUpdate() {
		update_utils = IUpdateUtilsImpl.getInstance(mContext, version_url,
				update_url, getCurrentAppName(), getCurrentVersionCode());

		if (update_utils != null) {
			if (NetHelper.checkNetwork(mContext)) {// 网络可用进行更新
				try {
					isUpdate = update_utils.isUpdate();
				} catch (IOException e) {
					isUpdate = false;
				}
			} else {
				isUpdate = false;
			}
			if (isUpdate == true) {
				update_dialog = update_utils.getUpdateDialog(mContext);
				if (update_dialog != null) {
					update_dialog.setCancelable(false);
					update_dialog.show();
				}
			}
		}
	}

	/**
	 * @描述：检测是否有新版本，用于设置等页面用来给用户提示
	 * @param context
	 * @throws IOException
	 */
	public boolean hasNewVersion(Context context) {
		boolean hasNewVersion = false;
		mContext = context;
		if (update_utils == null) {
			update_utils = IUpdateUtilsImpl.getInstance(context, version_url,
					update_url, getCurrentAppName(), getCurrentVersionCode());
		}
		try {
			isUseStrictMode(context);
			hasNewVersion = update_utils.isUpdate();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return hasNewVersion;
	}

	/**
	 * @描述：是否使用严格模式
	 * @param context
	 */
	private void isUseStrictMode(Context context) {
		if (isLowOrHigh()) {
			StrictModeWrapper.init(context);
		}
	}

	/**
	 * @描述：获取应用的版本号
	 * @return
	 */
	private int getCurrentVersionCode() {
		String packageName = mContext.getPackageName();
		try {
			return mContext.getPackageManager().getPackageInfo(packageName, 0).versionCode;
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return -1;
	}

	/**
	 * @描述：获取应用名
	 * @return
	 */
	private String getCurrentAppName() {
		String appName = "";
		String packageName = mContext.getPackageName();
		try {
			ApplicationInfo packageInfo = mContext.getPackageManager()
					.getApplicationInfo(packageName,
							PackageManager.GET_META_DATA);
			appName = mContext.getPackageManager()
					.getApplicationLabel(packageInfo).toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return appName + ".apk";
	}

}
